package com.exercise.utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * @Description:
 * @Date: 2019/11/13 13:47
 * @author: xfei
 */
public class DateUtils {

    /************************************* 获取日期开始 ****************************************/

    /**
     *
     * @param n 参数
     * @exception: 获取当前日期之前或之后的日期时间
     * @date: 2019/11/14 10:04
     * @return: java.lang.String
     */
    public static String getPastOrFutureDay(int n) {
        Calendar calendar = Calendar.getInstance();
        SimpleDateFormat sdf = new SimpleDateFormat(Contant.DEFUALT_DATE);
        calendar.add(Calendar.DATE, n);
        return sdf.format(calendar.getTime());
    }

    /**
     *
     * @param begin 开始时间
     * @param end 结束时间
     * @param isAbs 是否取绝对值
     * @exception: 计算两个时间之间的时间间隔
     * @date: 2019/11/14 9:54
     * @return: int
     */
    public static int getInterval(Date begin, Date end, boolean isAbs) {
        int a = 24 * 60 * 60 * 1000;
        long interval = end.getTime() - begin.getTime();
        long days = interval / a;
        Long l = new Long(days);
        if (isAbs) {
            return Math.abs(l.intValue());
        } else {
            return l.intValue();
        }
    }

    /**
     *
     * @exception: 获取当前时间的天
     * @date: 2019/11/14 9:57
     * @return: java.lang.String
     */
    public static String getCurrentDay() {
        return get(getNowDate(), Calendar.DAY_OF_MONTH);
    }

    /**
     *
     * @exception: 获取当前时间的月份
     * @date: 2019/11/14 9:56
     * @return: java.lang.String
     */
    public static String getCurrentMonth() {
        return get(getNowDate(), Calendar.MONTH);
    }

    /**
     *
     * @exception: 获取当前时间的年份
     * @date: 2019/11/14 9:56
     * @return: java.lang.String
     */
    public static String getCurrentYear() {
        return get(getNowDate(), Calendar.YEAR);
    }

    /**
     *
     * @param date 日期实例
     * @exception: 获取指定时间的天
     * @date: 2019/11/14 9:47
     * @return: java.lang.String
     */
    public static String getDay(Date date) {
        return get(date, Calendar.DAY_OF_MONTH);
    }

    /**
     *
     * @param date 日期实例
     * @exception: 获取指定日期的月份
     * @date: 2019/11/14 9:46
     * @return: java.lang.String
     */
    public static String getMonth(Date date) {
        return get(date, Calendar.MONTH);
    }

    /**
     *
     * @param date 日期实例
     * @exception: 获取指定日期的年份
     * @date: 2019/11/14 9:41
     * @return: java.lang.String
     */
    public static String getYear(Date date) {
        return get(date, Calendar.YEAR);
    }

    /**
     *
     * @param date 日期实例
     * @param calendarField 日历标记
     * @exception: 获取指定日期的年月日等
     * @date: 2019/11/14 9:36
     * @return: java.lang.String
     */
    public static String get(Date date, int calendarField) {
        if (date == null) {
            return null;
        }
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        int result = calendar.get(calendarField);
        if (calendarField == Calendar.MONTH) {
            result ++;
        }
        return String.valueOf(result);
    }

    /**
     *
     * @exception: 获取主机当前时间
     * @date: 2019/11/13 16:52
     * @return: java.util.Date
     */
    public static Date getNowDate() {
        return new Date();
    }

    /************************************* 获取日期结束 ****************************************/

    /************************************* 日期加减开始 ****************************************/

    /**
     *
     * @param date 需要操作的日期实例
     * @param amount 需要增加或减少的毫秒数
     * @exception: 在指定的时间上增加或减少毫秒数
     * @date: 2019/11/14 9:23
     * @return: java.util.Date
     */
    public static Date addMilliseconds(Date date, int amount) {
        return add(date, Calendar.MILLISECOND, amount);
    }

    /**
     *
     * @param date 需要操作的日期实例
     * @param amount 需要增加或减少的秒数
     * @exception: 在指定时间上增加或减少秒数
     * @date: 2019/11/14 9:20
     * @return: java.util.Date
     */
    public static Date addSeconds(Date date, int amount) {
        return add(date, Calendar.SECOND, amount);
    }

    /**
     *
     * @param date 需要操作的日期实例
     * @param amount 需要增加或减少的分钟数
     * @exception: 在指定时间上增加或减少分钟数
     * @date: 2019/11/14 9:20
     * @return: java.util.Date
     */
    public static Date addMinutes(Date date, int amount) {
        return add(date, Calendar.MINUTE, amount);
    }

    /**
     *
     * @param date 需要操作的日期实例
     * @param amount 需要增加或减少的小时数
     * @exception: 在指定时间上增加或减少小时数
     * @date: 2019/11/14 9:14
     * @return: java.util.Date
     */
    public static Date addHours(Date date, int amount) {
        return add(date, Calendar.HOUR_OF_DAY, amount);
    }

    /**
     *
     * @param date 需要操作的日期实例
     * @param amount 需要增加或者减少的天数
     * @exception: 在指定时间上增加或减少天数
     * @date: 2019/11/14 9:11
     * @return: java.util.Date
     */
    public static Date addDays(Date date, int amount) {
        return add(date, Calendar.DAY_OF_MONTH, amount);
    }

    /**
     *
     * @param date 需要操作的日期实例
     * @param amount 需要增加或减少的月数
     * @exception: 在指定时间上增加或减少多少月
     * @date: 2019/11/13 18:06
     * @return: java.util.Date
     */
    public static Date addMonths(Date date, int amount) {
        return add(date, Calendar.MONTH, amount);
    }

    /**
     *
     * @param date 需要操作的日期实例
     * @param amount 需要增加或减少的年数
     * @exception: 在指定时间上增加或者减少多少年
     * @date: 2019/11/13 18:03
     * @return: java.util.Date
     */
    public static Date addYears(Date date, int amount) {
        return add(date, Calendar.YEAR, amount);
    }

    /**
     *
     * @param date 需要操作的日期实例
     * @param calendarField 需要操作的日历标记
     * @param amount 需要增加或减少的数量
     * @exception: 对日期进行增加减少操作
     * @date: 2019/11/13 18:02
     * @return: java.util.Date
     */
    public static Date add(Date date, int calendarField, int amount) {
        if (date == null) {
            return null;
        }
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(calendarField, amount);
        return calendar.getTime();
    }

    /************************************* 日期加减结束 ****************************************/

    /************************************* 字符串解析开始 ****************************************/

    /**
     *
     * @param param 需要解析的字符串
     * @exception: 将字符串转换成默认的日期格式
     * @date: 2019/11/13 17:45
     * @return: java.util.Date
     */
    public static Date parseStrToDate(String param) {
        Date date = null;
        try {
            date = parseStrToDate(param, Contant.DEFUALT_DATETIME);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }

    /**
     *
     * @param param 需要解析的字符串
     * @param pattern 转换成指定的格式
     * @exception: 将字符串转换成指定格式的日期
     * @date: 2019/11/13 17:44
     * @return: java.util.Date
     */
    public static Date parseStrToDate(String param, String pattern) throws ParseException {
        if (StringUtils.isEmpty(param)) {
            return null;
        }
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
        Date date = simpleDateFormat.parse(param);
        return date;
    }

    /************************************* 字符串解析结束 ****************************************/

    /************************************* 日期格式化开始 ****************************************/

    /**
     *
     * @param millis 时间毫秒数
     * @exception: 将毫秒数转换成日期类，转换成指定格式
     * @date: 2019/11/13 17:05
     * @return: java.lang.String
     */
    public static String format(long millis) {
        return format(millis, Contant.DEFUALT_DATETIME);
    }

    /**
     *
     * @param millis 时间毫秒数
     * @param pattern 日期格式
     * @exception: 将毫秒数转换成指定的日期格式
     * @date: 2019/11/13 17:34
     * @return: java.lang.String
     */
    public static String format(long millis, String pattern) {
        Date date = new Date(millis);
        return format(date, pattern);
    }

    /**
     *
     * @param calendar 需要操作的日历实例
     * @exception: 将日历实例转换成默认格式
     * @date: 2019/11/13 17:33
     * @return: java.lang.String
     */
    public static String format(Calendar calendar) {
        return format(calendar, Contant.DEFUALT_DATETIME);
    }

    /**
     *
     * @param calendar 需要格式化的日历实例
     * @param pattern 目标格式
     * @exception: 将日历类转换成指定的格式
     * @date: 2019/11/13 17:30
     * @return: java.lang.String
     */
    public static String format(Calendar calendar, String pattern) {
        if (calendar == null) {
            return null;
        }
        Date date = calendar.getTime();
        return format(date, pattern);
    }

    /**
     *
     * @param date 需要格式化的日期实例
     * @exception: 将日期格式化成指定的格式
     * @date: 2019/11/13 17:24
     * @return: java.lang.String
     */
    public static String format(Date date) {
        return format(date, Contant.DEFUALT_DATETIME);
    }

    /**
     *
     * @param date 日期实例
     * @param pattern 要转换的格式
     * @exception: 将日期装换成固定的格式
     * @date: 2019/11/13 17:01
     * @return: java.lang.String
     */
    public static String format(Date date, String pattern) {
        if (date == null) {
            return null;
        }
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
        String result = simpleDateFormat.format(date);
        return result;
    }

    /************************************* 日期格式化开始 ****************************************/
}
